2 #ifndef FrameLib_THREADING_H 3 #define FrameLib_THREADING_H 7 #include <libkern/OSAtomic.h> 9 #include <mach/semaphore.h> 10 #include <mach/task.h> 18 static inline int32_t increment32(Atomic32 *a) {
return OSAtomicIncrement32Barrier(a); }
19 static inline int32_t decrement32(Atomic32 *a) {
return OSAtomicDecrement32Barrier(a); }
20 static inline int32_t add32(Atomic32 *a, int32_t b) {
return OSAtomicAdd32Barrier(b, a); }
21 static inline bool compareAndSwap32(Atomic32 *loc, int32_t comp, int32_t exch) {
return OSAtomicCompareAndSwap32Barrier(comp, exch, loc); }
25 static inline bool compareAndSwapPtr(AtomicPtr *loc,
void *comp,
void *exch) {
return OSAtomicCompareAndSwapPtrBarrier(comp, exch, loc); }
26 static inline void *swapPtr(AtomicPtr *loc,
void *swap)
30 while (!compareAndSwapPtr(loc, ptr, swap))
51 static inline long increment32(Atomic32 *a) {
return InterlockedIncrement(a); }
52 static inline long decrement32(Atomic32 *a) {
return InterlockedDecrement(a); }
53 static inline long add32(Atomic32 *a,
long b) {
return InterlockedAdd(a, b); }
54 static inline bool compareAndSwap32(Atomic32 *loc,
long comp,
long exch) {
return InterlockedCompareExchange(loc, exch, comp) == comp; }
58 static inline bool compareAndSwapPtr(AtomicPtr *loc,
void *comp,
void *exch) {
return InterlockedCompareExchangePointer(loc, exch, comp) == comp; }
59 static inline void *swapPtr(AtomicPtr *loc,
void *swap) {
return InterlockedExchangePointer(loc, swap); }
78 bool compareAndSwap(int32_t comparand, int32_t exchange) {
return OS_Specific::compareAndSwap32(&mValue, comparand, exchange); }
80 int32_t operator = (
const int32_t value)
86 int32_t operator += (
const int32_t& a) {
return OS_Specific::add32(&mValue, a); }
88 int32_t operator ++ () {
return OS_Specific::increment32(&mValue); }
90 int32_t operator -- () {
return OS_Specific::decrement32(&mValue); }
98 Atomic32& operator=(
const Atomic32&);
106 template <
class T>
class AtomicPtr
113 bool compareAndSwap(T *comparand, T *exchange) {
return OS_Specific::compareAndSwapPtr(&mValue, comparand, exchange); }
114 T *
swap(T *exchange) {
return (T *) OS_Specific::swapPtr(&mValue, exchange); }
122 AtomicPtr& operator=(
const AtomicPtr&);
138 bool attempt() {
return mAtomicLock.compareAndSwap(0, 1); }
140 void release() { mAtomicLock.compareAndSwap(1, 0); }
149 Atomic32 mAtomicLock;
181 typedef void ThreadFunctionType(
void *);
185 enum PriorityLevel {kLowPriority, kMediumPriority, kHighPriority, kAudioPriority};
188 : mInternal(NULL), mPriority(priority), mThreadFunction(threadFunction), mArg(arg), mValid(false)
206 void call() { mThreadFunction(mArg); }
212 ThreadFunctionType *mThreadFunction;
274 static void threadEntry(
void *thread);
275 void threadClassEntry();
279 virtual void doTask() = 0;
320 static void threadEntry(
void *thread);
321 void threadClassEntry();
325 virtual void doTask() = 0;
DWORD WINAPI OSThreadFunctionType(LPVOID arg)
Definition: FrameLib_Threading.h:63
T * clear()
Definition: FrameLib_Threading.h:115
Definition: FrameLib_Threading.h:130
bool attempt()
Definition: FrameLib_Threading.h:138
SpinLockHolder(SpinLock *lock)
Definition: FrameLib_Threading.h:160
void signal()
Definition: FrameLib_Threading.h:263
void start()
Definition: FrameLib_Threading.h:300
void start()
Definition: FrameLib_Threading.h:258
Atomic32()
Definition: FrameLib_Threading.h:76
Definition: FrameLib_Threading.h:178
TriggerableThread(Thread::PriorityLevel priority)
Definition: FrameLib_Threading.h:253
void release()
Definition: FrameLib_Threading.h:140
SpinLock()
Definition: FrameLib_Threading.h:135
virtual ~DelegateThread()
Definition: FrameLib_Threading.h:296
int32_t operator++(int)
Definition: FrameLib_Threading.h:89
~SpinLock()
Definition: FrameLib_Threading.h:136
void destroy()
Definition: FrameLib_Threading.h:163
~SpinLockHolder()
Definition: FrameLib_Threading.h:161
HANDLE OSSemaphoreType
Definition: FrameLib_Threading.h:62
Definition: FrameLib_Threading.h:290
HANDLE OSThreadType
Definition: FrameLib_Threading.h:61
Definition: FrameLib_Threading.h:248
Atomic32(int32_t value)
Definition: FrameLib_Threading.h:75
Definition: FrameLib_Threading.h:220
volatile PVOID AtomicPtr
Definition: FrameLib_Threading.h:56
Definition: FrameLib_Threading.h:47
virtual ~TriggerableThread()
Definition: FrameLib_Threading.h:254
bool compareAndSwap(int32_t comparand, int32_t exchange)
Definition: FrameLib_Threading.h:78
AtomicPtr()
Definition: FrameLib_Threading.h:111
int32_t operator--(int)
Definition: FrameLib_Threading.h:91
volatile long Atomic32
Definition: FrameLib_Threading.h:49
Thread(PriorityLevel priority, ThreadFunctionType *threadFunction, void *arg)
Definition: FrameLib_Threading.h:187
void start()
Definition: FrameLib_Threading.cpp:120
bool compareAndSwap(T *comparand, T *exchange)
Definition: FrameLib_Threading.h:113
DelegateThread(Thread::PriorityLevel priority)
Definition: FrameLib_Threading.h:295
T * swap(T *exchange)
Definition: FrameLib_Threading.h:114
PriorityLevel
Definition: FrameLib_Threading.h:185
Definition: FrameLib_Threading.h:155
void acquire()
Definition: FrameLib_Threading.h:139